/*
 * Plaszczyzny.java
 *
 * Created on 15 pazdziernik 2007, 12:36
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package pla;

import gra.TVisualisation;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JComponent;
import odc.Odcinek;
import out.IOut;
import out.TOut2_3;
import pla.bib.Ebeno3D;
import ste.TAbstBlock;

/**
 *
 * @author arkadiusz
 */
public class Plaszczyzny  extends TAbstBlock{
  
  ArrayList<Odcinek> strekoj = new ArrayList<Odcinek>();

  int nrSkanu = 0;
  
  ArrayList<Odcinek> lastaListo;
  
  ArrayList< Ebeno3D > malePlaszczyzny = new ArrayList< Ebeno3D >();
  
  private EbenoPanelo miaPanelo = new EbenoPanelo(this);
  /** Creates a new instance of Plaszczyzny */
  @SuppressWarnings("unchecked")
  public Plaszczyzny() {
//    this.spaco
//      = (ArrayList<Odcinek>[][])
//      new ArrayList[2*this.maxDimX/this.dimCelo][2*this.maxDimY/this.dimCelo];
//
//    for (int i = 0; i < spaco.length; i++) {
//      for (int j = 0; j < spaco[i].length; j++) {
//        this.spaco[i][j] = new ArrayList<Odcinek>();
//      }
//    }
  }
  
  public String getTabTitle() {
    return "Plaszczyzny";
  }
  
  public JComponent getJComponent() {
    miaPanelo.add( getObjP() );
    return this.miaPanelo;
  }
  
  public void setNext(TAbstBlock aNext) {
  }
  
  public void checkSettings() {
  }
  
  //odcinki
  public void showGraphic() {
    TVisualisation lVis = new TVisualisation(); //do grafiki
    
    int i = 0;
    for(Ebeno3D eb : this.malePlaszczyzny){
      //if(!eb.getD().isNaN())
      lVis.addLineT(eb.getOdcinekA());
      lVis.addLineT(eb.getOdcinekB());
      //lVis.addPlaneT(eb.getPoint3d());
      //System.out.print(i++);
      //System.out.println(eb);
    }
    lVis.display(); //wyswietlenie grafiki
  } //koniec showGraphic
  //plaszczyzny
  public void showGraphic2() {
    TVisualisation lVis = new TVisualisation(); //do grafiki
    
    int i = 0;
    for(Ebeno3D eb : this.malePlaszczyzny){
      //System.out.print(i++);
      if(!eb.getD().isNaN()){
         lVis.addPlaneT(eb.getPoint3d());
         //System.out.println(eb);
      }
    }
    lVis.display(); //wyswietlenie grafiki
  }
  public void clear() {
    if (lastaListo != null) lastaListo.clear();
    if (malePlaszczyzny != null) malePlaszczyzny.clear();
    if (theNext != null) theNext.clear();
  }
  
  /**
   * @param o
   */
  public void starter(IOut o) {
    
    ++this.nrSkanu;
    
    TOut2_3 in = null;
    if (o instanceof TOut2_3) {
      in = (TOut2_3)o;
      
      //Wypisanie otrzymanych odcink�w
      //System.out.println ("SCAN 2D ile odcink�w: " + in.getOdcinki().size());
      //for (Odcinek odc : in.getOdcinki()) System.out.println ("odc.: " + odc);
    }
    this.puriguListon(in.getOdcinki());
    
    if( this.nrSkanu == 5){
      this.malePlaszczyzny = kreuEbenoj(in.getOdcinki());
    }
    
    if (this.nrSkanu % 10 == 0){ //kolejne odczyty
      ArrayList<Ebeno3D> listoTMP = kreuEbenoj(in.getOdcinki());
      
      //obiekt do dokowywania porownan dwoch plaszczyzn
      pla.bib.porEbeno3D por = new pla.bib.porEbeno3D(this.miaPanelo.getPorEbeno3D());
      
      //
      for(Ebeno3D e : this.malePlaszczyzny ){
        
        for(int j=0; j < listoTMP.size(); j++){
          if( por.estasSmilaj(e,listoTMP.get(j)) ){
            e.korektu(listoTMP.get(j));
            listoTMP.remove(j);
            break;
          }//if
          
        }//for
      }//for
      //!!! dodajemy by za kazdym razem ostatniwy
      this.malePlaszczyzny.addAll(listoTMP);
    }//if
    
    this.lastaListo = in.getOdcinki();
    
  }
   
  private ArrayList<Ebeno3D> kreuEbenoj(ArrayList<Odcinek> in) {
    ArrayList<Ebeno3D> Return = new     ArrayList<Ebeno3D>();
    pla.porOdcinek  por = new pla.porOdcinek(this.miaPanelo.getPorOdcinek());
    for (Odcinek A : in ){
      for (Odcinek B: this.lastaListo){
        if ( por.estasSmilaj(A,B)  ){// dwa odcinki sa podobne
          Return.add( new Ebeno3D(A,B) );
          //System.out.println(w);
        }
      }
    }
    return Return;
  }
  
  private void puriguListon(ArrayList<Odcinek> listo) {
    for(int i = 0 ; i < listo.size(); i++){
      if (listo.get(i).getLength() <0.00001)
        listo.remove(i);
    }
  }
  
  
}
